# -*- coding: UTF-8 -*-
from Vue import *
from Client import *
from Serveur import *
from menuVue import *
from Partie import *
from PlancheDeJeu.PlancheDeJeu import *
from Chat.ClientChat import *
from PlancheDeJeu.Joueur import *
import Pyro.core
import sys
import os
import subprocess

class Controleur():
    def __init__(self):
        #creer la variable de type Client
        self.client = None
        self.creerClient()
        
        #Backward compatibility
        self.partie = self.client.partie
        self.id = self.client.id
        self.pdj = self.client.pdj
        self.clientChat = self.client.clientChat
        self.serveur = None #Process
        self.sizeRoot = ConstantesFrogger.loadSizeConfig()

        self.vue = Vue(self, size=self.sizeRoot)
        
        self.size = (self.vue.widthFrame, self.vue.heightFrame)

        self.attendreDebutPartie() #Attente, timer, etc
        
        self.raffraichirVue()
        
        self.vue.root.mainloop()

    def isPartieStarted(self):
        return self.partie.isStarted(self.id)

    def commencerPartie(self):
        self.launchPlancheDeJeu()

        self.vue.afficherVuePrincipal()

        self.client.play()

    def creerClient(self):
        self.m = menuVue(self)

    def creerPartieSolo(self, nom):
        self.client = Client(self, None, nom)
        return self.client.getErreur()

    def rejoindrePartie(self, adresse, nomDuJoueur):
        self.client = Client(self, adresse, nomDuJoueur)
        return self.client.getErreur()
        
    def creerServeur(self):
        self.serveur = subprocess.Popen([sys.executable, 'Serveur.py'])

    def launchPlancheDeJeu(self):
        self.client.jobMiniJeuTermine.stop()
        self.partie.launchPlancheDeJeu(self.id)
        self.vue.root.after(50, lambda :self.vue.plancheDeJeu.setDimensions(self.pdj))
        self.vue.afficherVuePrincipal()
        self.client.jobMiniGameTime.start()
        
    def quit(self):
        self.vue.root.destroy()
        self.vue.root.quit()
        self.vue.quit()
        self.partie.quitJoueur(self.id)
        os._exit(0) #Brutal...
        sys.exit(0)
    
    def deplacement(self, status, direction):
        self.pdj.deplacementGrenouille(status, direction)
        self.vue.plancheDeJeu.updateMap(self.pdj, False)

    def raffraichirVue(self):
        try:
            liste = self.clientChat.recevoirMessages()
            self.vue.scores.updateStatutPartie(self.partie.getListeJoueurs()) 
            self.vue.chat.raffraichirMessages(liste)
        except:
            pass
        finally:
            self.vue.root.after(750, self.raffraichirVue)
        
    def envoyerMessage(self, message):
        self.clientChat.envoyerMessageServeur(message)
        
    def changerMode(self):
        self.client.changerMode()
        
    def getListeMiniJeux(self):
        return self.partie.getListeMiniJeux()

    def attendreDebutPartie(self):
        self.client.attendreDebutPartie()
        self.vue.attendreDebutPartie()

    def getJoueursDansPartie(self):
        """ Retourne le nombre de joueurs in et le nombre de joueurs total sous forme de tuple. """
        return self.client.getJoueursDansPartie()
    
    def setDimensions(self, width, height):
        ConstantesFrogger.saveSizeConfig(width, height)
    
    def getChosenOneName(self):
        return self.partie.getChosenOneName()
    

if __name__ == '__main__':
    Controleur()